package com.example.browser;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

public class ChromeAutomation {

    /**
     * 打开浏览器
     * */
    public void openChrome() throws UnsupportedEncodingException {
        String path = URLDecoder.decode(ChromeAutomation.class.getClassLoader().getResource("lib").getPath()+"/chromedriver.exe","utf-8") ;
        System.setProperty("webdriver.chrome.driver", path);// chromedriver服务地址
        ChromeOptions options = new ChromeOptions();
        //允许任何来源的远程连接，这样可以避免一些跨域问题。
        options.addArguments("--remote-allow-origins=*");
        //初始化 chrome 浏览器 driver 对象
        WebDriver webDriver = new ChromeDriver(options);
        //设置浏览器
        setBrowser(webDriver);
        // 访问指定网页
        webDriver.get("https://www.kuaishou.com/new-reco");
        while (true){
            WebElement webElement = locationElement(webDriver);
            if (webElement==null){
                return;
            }
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            triggerEvent(webDriver,webElement);
        }
    }

    /**
     * 设置浏览器
     * */
    private void setBrowser(WebDriver webDriver){
        webDriver.manage().window().maximize();//最大化窗口
        /**
         * 设置了隐式等待时间为500秒。
         * 这意味着，当WebDriver尝试查找一个元素时，它会等待最多500秒来等待元素的出现。
         * 如果在500秒内元素出现并可用，WebDriver将继续执行后续的操作；如果元素没有在这个时间内出现，将抛出异常。
         * */
//        webDriver.manage().timeouts().implicitlyWait(500,TimeUnit.SECONDS);
        webDriver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);//设置加载超时时间
    }

    /**
     * 定位元素
     *
     */
    private WebElement  locationElement(WebDriver webDriver){
        WebDriverWait webDriverWait=new WebDriverWait(webDriver,5000);
        webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".switch-btn.down")));
        List<WebElement> collect = webDriver.findElements(By.cssSelector(".switch-btn.down")).stream().filter(item ->
             item.findElements(By.className("mask-circle")) != null ? true : false
        ).collect(Collectors.toList());

        if (collect.isEmpty()){
            return null;
        }
        return collect.get(1);
    }

    /**
     * 触发元素单击事件
     * */
    private void triggerEvent(WebDriver driver,WebElement element){
        ((JavascriptExecutor)driver).executeScript("arguments[0].click()",element);
    }

}
